home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_07 / allison / destroy6.cpp < prev    next >
C/C++ Source or Header  |  1994-05-02  |  934b  |  60 lines

  1. LISTING 10 - Uses internal state to track a resource
  2.  
  3. // destroy6.cpp
  4. #include <stdio.h>
  5.  
  6. void f(char *fname);
  7.  
  8. main()
  9. {
  10.     try
  11.     {
  12.         f("file1.dat");
  13.     }
  14.     catch(...)
  15.     {
  16.         puts("Exception caught in main()");
  17.     }
  18.     return 0;
  19. }
  20.  
  21. void f(char *fname)
  22. {
  23.     class File
  24.     {
  25.         FILE *f;
  26.     public:
  27.         File(const char* fname, const char* mode)
  28.         {
  29.             f = fopen(fname, mode);
  30.         }
  31.         ~File()
  32.         {
  33.             if (f)
  34.             {
  35.                 fclose(f);
  36.                 puts("File closed");
  37.             }
  38.         }
  39.         operator void*() const
  40.         {
  41.             return f ? (void *) this : 0;
  42.         }
  43.     };
  44.  
  45.     File x(fname,"r");
  46.     if (x)
  47.     {
  48.         // Use file here
  49.         puts("Processing file...");
  50.     }
  51.     throw 1;
  52. }
  53.  
  54. /* Output:
  55. Processing file...
  56. File closed
  57. Exception caught in main()
  58. */
  59.  
  60.